#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "structures.h"
#include "init.h"
#include "affichage.h"
#include "jeu.h"
#include "fichiers.h"
#include "menu.h"
#include "highscore.h"

/*
	Le main contient la logique du jeu et les differents modes de demarrage 
	et gere les appels aux sous menus 
	N => nouvelle partie
	R => rejouer partie 
	Q => quitter
	S => sauvegarder
	A => Tricher
	Z -> annuler triche
*/



int main (int argc, char const* argv[])
{	
		int l ,  col , m ,e, mines_caches , *tab2=NULL;		
		int x=0 ,y=0, etat =0 , cases_sans_mines= 0, reponse=0, i;
		char rep ,*nom_fic = (char*) malloc(25) ,continu;
		clock_t start , end ;
		double elapsed ;
		champs c ;
		double HS = init_hs();
		do{
		
		//============== TYPE DE DEMARRAGE ==============================
		/*
			3 type de demarrages :
			   - Avec parametres 	
			   - Sans parametres
			   - Avec fichier de sauvegarde 
				
		*/		
		switch(debut(argc,argv)){
			
			
			// 0 => On entre dans le programme sans donner de parametres
			case 0 :  
					/* Si le joueur ne rejoue pas la meme partie */
					if(continu!='R'){	
						  bienvenue(&l,&col,&m,&e) ; // on lui presente un menu de bienvenue
					 }
					cases_sans_mines = l*col - m ;	
					 if(continu!='R')
					 	c = init (l,col,m) ;
					 else
					   cacher(c);
		 			  c->nb_erreurs_restant = e ;	
	 				  break ;
	 				  
	 				  
			// 1 => On entre dans le programme en donnant des parametres
			case 1 :  
			  		 /* Recuperation des parametres */
					  l = atoi(argv[1]) ,col = atoi(argv[2]) , m= atoi(argv[3]) ;
					  if(m>=l*col || m<1)
					  {
					  	fprintf(stderr,"Nombre de mines incorrecte");
					  	exit(1);
					  }
					  cases_sans_mines = l*col - m ;	
					  if(continu!='R')
					  	 c = init (l,col,m) ;
					  else
					  	cacher(c);
					  e = (argc>=5) ? atoi(argv[4])  : 0 ;
	 				  c->nb_erreurs_restant = e ;	
	 				  break ;
	 				  
	 		// 2 => On entre dans le programme en donnant des parametres -f pour sauvegarde
	 		case 2 :  strcpy(nom_fic , argv[2]) ;
	 				  c = lire(nom_fic,&cases_sans_mines) ;
		}
		
		
		//================== DEROULEMENT DU JEU =======================
		start = clock();  //demarrage du chrono 
			
	 	while((etat!=PERDU)&&(etat!=GAGNE)){
	 		/* affichage du demineur */
		 	eff_ec ;
		 	affichage(c);
		 	/* affichage du menu  */
		 	menu_jeu(c->nb_erreurs_restant,cases_sans_mines); 
		 	/*recuperation des entrees claviers */
		 	reponse=scanf("%d %d",&x,&y);
		 	if (reponse==0){
		 		reponse = scanf("%c",&rep);
		 		
		 	//============== GESTION DES OPTIONS ======================
		 	  switch(toupper(rep)){
		 		case 'Q' :	printf(" !!! Bye Bye!!! ");
		 					exit(0);
		 		case 'A' : 
		 				if(!tab2){
							tab2 = (int*) malloc(m*sizeof(int));
							mines_caches = secret_afficher(c,tab2);
							x=-1, y=-1; 
						}
							break;
				case 'Z' :  
						if(tab2!=NULL) 
								secret_cacher(c,tab2,mines_caches);
						tab2 = NULL;
						x=-1, y=-1; 
						break;
		 		case 'S' : printf(" !!! SAUVEGARDE !!! ");
		 		 			menu_sauvegarde(c);
		 		 			break;
		 		default  : x = -1 , y = -1;
		 	 }			 			
		 	}	
		 	//=========== DEVOILEMENT DE LA CASE =====================
		 	jeu(c,x,y,&cases_sans_mines);
		 	//=============== TEST DE L ETAT DU JEU =====================
		 	etat = testVictoire(cases_sans_mines,c->nb_erreurs_restant);
 		}
 		end = clock(); // fin du chrono
 		
 		//============================AFFICHAGE RESULTAT=========================
 		elapsed = ((double)end - start)/CLOCKS_PER_SEC ;
 		switch(etat){
 			case GAGNE : continu = victoire(c,m,elapsed); break;
 			case PERDU : continu = defaite(c,m) ;break;
 		}
 		//============== REINITIALISATION DANS LE CAS DE POURSUITE DU JEU  =========
 	if(continu!='R')
	 		{argc  = 1 ;free(c);}
 	etat=x=y=-1 ;
 		
 	 }while(continu!='Q');	
 	free(c);
    return 0;
}

